package {{package}};

import {{invokerPackage}}.ApiClient;
import {{invokerPackage}}.EncodingUtils;
{{#legacyDates}}
import {{invokerPackage}}.ParamExpander;
{{/legacyDates}}

{{#imports}}import {{import}};
{{/imports}}

{{^fullJavaUtil}}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
{{/fullJavaUtil}}
import feign.*;

{{>generatedAnnotation}}
public interface {{classname}} extends ApiClient.Api {

{{#operations}}
{{#operation}}
{{#contents}}
  /**
   * {{summary}}
   * {{notes}}
   {{#parameters}}
   * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
   {{/parameters}}
   {{#returnType}}
   * @return {{returnType}}
   {{/returnType}}
   {{#externalDocs}}
   * {{description}}
   * @see <a href="{{url}}">{{summary}} Documentation</a>
   {{/externalDocs}}
   */
  @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{baseName}}={{braces "left"}}{{paramName}}{{braces "right"}}{{#has this 'more'}}&{{/has}}{{/queryParams}}")
  @Headers({
  {{#vendorExtensions.x-contentType}}
      "Content-Type: {{{vendorExtensions.x-contentType}}}",
  {{/vendorExtensions.x-contentType}}
  {{#vendorExtensions.x-accepts}}
      "Accept: {{{vendorExtensions.x-accepts}}}",
  {{/vendorExtensions.x-accepts}}
  {{^vendorExtensions.x-accepts}}
      "Accept: */*",
  {{/vendorExtensions.x-accepts}}
  {{#headerParams}}
    "{{baseName}}: {{braces "left"}}{{paramName}}{{braces "right"}}"{{#has this 'more'}},{{/has}}
  {{/headerParams}}
  })
  {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#parameters}}{{#isNot this 'body-param'}}{{^legacyDates}}@Param("{{paramName}}") {{/legacyDates}}{{#legacyDates}}@Param(value="{{paramName}}", expander=ParamExpander.class) {{/legacyDates}}{{/isNot}}{{{dataType}}} {{paramName}}{{#has this 'more'}}, {{/has}}{{/parameters}});
  {{#hasQueryParams}}

  /**
   * {{summary}}
   * {{notes}}
   * Note, this is equivalent to the other <code>{{operationId}}</code> method,
   * but with the query parameters collected into a single Map parameter. This
   * is convenient for services with optional query parameters, especially when
   * used with the {@link {{operationIdCamelCase}}QueryParams} class that allows for
   * building up this map in a fluent style.
   {{#parameters}}
   {{#isNot this 'query-param'}}
   * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
   {{/isNot}}
   {{/parameters}}
   * @param queryParams Map of query parameters as name-value pairs
   *   <p>The following elements may be specified in the query map:</p>
   *   <ul>
   {{#queryParams}}
   *   <li>{{paramName}} - {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}</li>
   {{/queryParams}}
   *   </ul>
   {{#returnType}}
   * @return {{returnType}}
   {{/returnType}}
   {{#externalDocs}}
   * {{description}}
   * @see <a href="{{url}}">{{summary}} Documentation</a>{{/externalDocs}}
   */
  @RequestLine("{{httpMethod}} {{{path}}}?{{#queryParams}}{{baseName}}={{braces "left"}}{{paramName}}{{braces "right"}}{{#has this 'more'}}&{{/has}}{{/queryParams}}")
  @Headers({
  {{#vendorExtensions.x-contentType}}
      "Content-Type: {{{vendorExtensions.x-contentType}}}",
  {{/vendorExtensions.x-contentType}}
  {{^vendorExtensions.x-contentType}}
      "Content-Type: */*",
  {{/vendorExtensions.x-contentType}}
  {{#vendorExtensions.x-accepts}}
      "Accept: {{{vendorExtensions.x-accepts}}}",
  {{/vendorExtensions.x-accepts}}
  {{#headerParams}}
      "{{baseName}}: {{braces "left"}}{{paramName}}{{braces "right"}}"{{#has this 'more'}},{{/has}}
  {{/headerParams}}
  })
  {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#parameters}}{{#isNot this 'query-param'}}{{#isNot this 'body-param'}}{{^legacyDates}}@Param("{{paramName}}") {{/legacyDates}}{{#legacyDates}}@Param(value="{{paramName}}", expander=ParamExpander.class) {{/legacyDates}}{{/isNot}}{{{dataType}}} {{paramName}}, {{/isNot}}{{/parameters}}@QueryMap(encoded=true) Map<String, Object> queryParams);

  /**
   * A convenience class for generating query parameters for the
   * <code>{{operationId}}</code> method in a fluent style.
   */
  public static class {{operationIdCamelCase}}QueryParams extends HashMap<String, Object> {
    {{#queryParams}}
    public {{operationIdCamelCase}}QueryParams {{paramName}}(final {{{dataType}}} value) {
        {{#collectionFormat}}
      put("{{baseName}}", EncodingUtils.encodeCollection(value, "{{collectionFormat}}"));
        {{/collectionFormat}}
        {{^collectionFormat}}
      put("{{baseName}}", EncodingUtils.encode(value));
        {{/collectionFormat}}
      return this;
    }
    {{/queryParams}}
  }
  {{/hasQueryParams}}
  {{/contents}}
  {{/operation}}
{{/operations}}
}
